#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <assert.h>

//int my_strlen(const char* str)
//{
//    assert(str != NULL);//或者写成assert (str)
//    int count = 0;//
//    while (*str != '\0')
//    {
//        count++;
//        str++;
//    }
//    return count;//
//}
//int main()
//{
//    char arr[] = "hello bit";//
//    int len = my_strlen(arr);//
//    printf("%d\n", len);//
//    return 0;//
//}

//int main()
//{
//    char arr1[20] = "XXXXXXXXXXX";//
//    char arr2[20] = "hello bit";//
//    strcpy(arr1, arr2);//这个函数会把hello bit\0这10个字符都放在arr1里
//    //即arr1在执行后放的是hello bit\0X\0\0\0\0\0\0\0\0\0\0
//    printf("%s\n", arr1);//打印的时候纸打印斜杠零\0前的字符
//    return 0;//
//}

//或者使用自创的字符串拷贝函数

//void my_strcpy(char* dest, char* src)
//{
//    while (*src != '\0')
//    {
//        *dest = *src;
//        dest++;//
//        src++;//
//    }
//    *dest = *src;//
//}
//int main()
//{
//    char arr1[20] = "XXXXXXXXXXX";//
//    char arr2[20] = "hello bit";//
//    my_strcpy(arr1, arr2);
//    printf("%s\n", arr1);//打印的时候纸打印斜杠零\0前的字符
//    return 0;//
//}

//但这个代码还是不够精简，可以考虑以下的代码

//char* my_strcpy(char* dest, const char* src)
//const是为了保证源字符串不能被修改
//这防止了源字符串和目的字符串放反的情况
//返回的是char*类型的指针，保证了未来想要实现链式访问时
//这个函数可以作为程序中某一句话的一个参数进行传参
//{
//    char* ret = dest;//
//    assert(src != NULL);//针对空指针NULL不能解引用的标准模板
//    //assert后面的判断语句如果为假，直接程序报错
//    assert(dest != NULL);
//    while (*dest++ = *src++)
//    {
//        ;//
//    }
//    return ret;
//    在编程的时候，自己写的函数如果要求返回值是指针变量
//    一定要检查：1、在main函数中会不会对这个指针变量解引用
//    2、这个子函数执行结束后，返回的指针变量也将被还给操作系统，
//    检查这个指针变量的地址是否后面有一串有意义的内容
//}
//int main()
//{
//    char arr1[20] = "XXXXXXXXXXX";//
//    char arr2[20] = "hello bit";//
//    char* str = my_strcpy(arr1, arr2);
//    printf("%s\n", str);//打印的时候纸打印斜杠零\0前的字符
//    return 0;//
//}

//int main()
//{
//	const int num = 10;//
//	const int* p = &num;
//	//此时表明p这个指针变量所指向的内容是不能改动的
//	//即这句话之后*p = 20; 这句话就是错的了
//
//	int* const p = &num;
//	//此时表明p这个指针变量里放的地址不可改,即p不能指向其它地址
//	//即这句话之后int n = 100; p = &n; 这两句话就是错的了
//
//	printf("%d\n", num);//
//	return 0;//
//}

int main()
{
    int i = 0;//
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//
    for (i = 0; i <= 12; i++)
    {
        arr[i] = 0;
        //越界访问，依然可以有解引用操作，即arr [11]仍然会被改成0
        printf("hehe\n");//
    }
    return 0;//
}
//在VS编译器中，i对应的内存空间和arr[10]对应的
//内存空间的最后一个元素之间正好隔了8个字节
//这表示当for循环执行到i=12时，arr[12]就是i，此时将0赋值给arr[12]
//就是把0赋值给i，那么i永远不会使得i <= 12这个条件不成立，故程序死循环